home *** CD-ROM | disk | FTP | other *** search
/ Millennium Gold 2000 / Millennium Gold 2000 - Disc 1.iso / HYPEROID / ROIDSUPP.C < prev    next >
C/C++ Source or Header  |  1994-04-12  |  19KB  |  545 lines

  1. // ***************************************************************************
  2. // ROIDSUPP.C - hyperoid support functions
  3. //
  4. // Version: 1.1  Copyright (C) 1990,91 Hutchins Software
  5. //      This software is licenced under the GNU General Public Licence
  6. //      Please read the associated legal documentation
  7. //
  8. // Author: Edward Hutchins
  9. // Internet: eah1@cec1.wustl.edu
  10. // USMail: c/o Edward Hutchins, 63 Ridgemoor Dr., Clayton, MO, 63105
  11. //
  12. // Revisions:
  13. // 11/01/91 added GNU General Public License - Ed.
  14. //
  15. // Music: R.E.M./The Cure/Ministry/Front 242/The Smiths/New Order/Hendrix...
  16. // Beers: Bass Ale, Augsberger Dark
  17. //
  18. // 03/04/92 ported to Win32 - Paul Tissue & Robert Hess [Microsoft].
  19. // ***************************************************************************
  20. #include "hyperoid.h"
  21.  
  22. //
  23. // defines
  24. //
  25.  
  26. // You may ask, "why did he embed all these string constants instead of
  27. // using the resource file?". Good question.  The answer is: I feel better
  28. // knowing this stuff is part of the executable, and not part of the resource
  29. // file (which can be changed by sneaky people). Or maybe I wuz lazy.
  30. // If you don't like it, then YOU can change it!
  31.  
  32. #define NL "\x0d\x0a"
  33.  
  34. #define HYPEROID_HELP \
  35. "The following keys control your ship:" NL NL \
  36. "  Left, Right Arrow .... spin left or right" NL \
  37. "  Down, Up Arrow ..... forward or reverse thrust" NL \
  38. "  Space Bar .............. fire!" NL \
  39. "  Tab ......................... shields" NL \
  40. "  S ............................. smartbomb" NL \
  41. "  Esc ......................... pause/boss key" NL NL \
  42. "Note: You have 3 lives, unlimited fuel and firepower, 3 shields and 3 " \
  43. "smartbombs. Your ship gets darker when you lose a life, but you keep on " \
  44. "playing (unless you hit an asteroid). You get an extra life every 100,000 " \
  45. "points. When you lose the game, you start over immediately and can finish " \
  46. "off the current level (which should now be 0) before starting over at " \
  47. "level 1 (There is no waiting around between games)."
  48.  
  49. #define HYPEROID_HELP2 \
  50. "The HYPEROID.INI file can be created/modified to change default settings " \
  51. "in Hyperoid. Here are some of the items you can set:" NL \
  52. NL "[Hyperoid]" NL "Max=<0/1>" NL "{X,Y,W,H}=<n>" NL "Mono=<0/1>" NL \
  53. "DrawDelay=<ms> ;microseconds/frame" NL \
  54. NL "[Palette]" NL \
  55. "{Black,DkGrey,Grey,White," NL \
  56. " DkRed,Red,DkGreen,Green,DkBlue,Blue," NL \
  57. " DkYellow,Yellow,DkCyan,Cyan," NL \
  58. " DkMagenta,Magenta}=<r>,<g>,<b>" NL \
  59. NL "[Keys]" NL \
  60. "{Shield,Clockwise,CtrClockwise," NL \
  61. " Thrust,RevThrust,Fire,Bomb}=<virtual keycode>" NL NL \
  62. "Note: Virtual keycodes usually match the key's ASCII value."
  63.  
  64. #define HYPEROID_HELPSTYLE (MB_OK | MB_ICONASTERISK)
  65.  
  66. // this is the part I especially want in the executable image
  67.  
  68. #define HYPEROID_LICENSE \
  69. "This program is free software; you can redistribute it and/or modify " \
  70. "it under the terms of the GNU General Public License as published by " \
  71. "the Free Software Foundation; either version 1, or (at your option) " \
  72. "any later version. " \
  73. NL NL \
  74. "This program is distributed in the hope that it will be useful, " \
  75. "but WITHOUT ANY WARRANTY; without even the implied warranty of " \
  76. "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the " \
  77. "GNU General Public License for more details. " \
  78. NL NL \
  79. "You should have received a copy of the GNU General Public License " \
  80. "along with this program; if not, write to the Free Software " \
  81. "Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. "
  82.  
  83. //
  84. // imports
  85. //
  86.  
  87. IMPORT CHAR    szAppName[32] FROM ( hyperoid.c );
  88. IMPORT HANDLE  hAppInst      FROM ( hyperoid.c );
  89. IMPORT HWND    hAppWnd       FROM ( hyperoid.c );
  90. IMPORT BOOL    bBW           FROM ( hyperoid.c );
  91. IMPORT INT     nDrawDelay    FROM ( hyperoid.c );
  92. IMPORT INT     vkShld        FROM ( hyperoid.c );
  93. IMPORT INT     vkClkw        FROM ( hyperoid.c );
  94. IMPORT INT     vkCtrClkw     FROM ( hyperoid.c );
  95. IMPORT INT     vkThrst       FROM ( hyperoid.c );
  96. IMPORT INT     vkRvThrst     FROM ( hyperoid.c );
  97. IMPORT INT     vkFire        FROM ( hyperoid.c );
  98. IMPORT INT     vkBomb        FROM ( hyperoid.c );
  99. IMPORT LONG    lHighScore    FROM ( hyperoid.c );
  100.  
  101. //
  102. // globals
  103. //
  104.  
  105. // these parts map to "abcdefghijklm"
  106. GLOBAL POINT        LetterPart[] =
  107. {
  108.   {83, 572}, {64, 512}, {45, 572}, {96, 362}, {32, 362},
  109.   {128, 256}, {0, 0}, {0, 256},
  110.   {160, 362}, {224, 362}, {173, 572}, {192, 512}, {211, 572}
  111. };
  112.  
  113. // here's the vector font
  114. GLOBAL LPSTR        szNumberDesc[] =
  115. {
  116.         "cakmck",       // 0
  117.         "dbl",          // 1
  118.         "abekm",        // 2
  119.         "abegjlk",      // 3
  120.         "mcfh",         // 4
  121.         "cbfgjlk",      // 5
  122.         "bdiljgi",      // 6
  123.         "acgl",         // 7
  124.         "bdjlieb",      // 8
  125.         "ljebdge"       // 9
  126. };
  127.  
  128. GLOBAL LPSTR        szLetterDesc[] =
  129. {
  130.         "kdbemhf",      // A
  131.         "kabegjlk",     // B
  132.         "cbflm",        // C
  133.         "kabejlk",      // D
  134.         "cafgfkm",      // E
  135.         "cafgfk",       // F
  136.         "bdiljhg",      // G
  137.         "kafhcm",       // H
  138.         "bl",           // I
  139.         "cjli",         // J
  140.         "akcgm",        // K
  141.         "akm",          // L
  142.         "kagcm",        // M
  143.         "kamc",         // N
  144.         "bdiljeb",      // O
  145.         "kabegf",       // P
  146.         "mlidbejl",     // Q
  147.         "kabegfgm",     // R
  148.         "ebdjli",       // S
  149.         "lbac",         // T
  150.         "ailjc",        // U
  151.         "alc",          // V
  152.         "akgmc",        // W
  153.         "amgkc",        // X
  154.         "aglgc",        // Y
  155.         "ackm"          // Z
  156. };
  157.  
  158. //
  159. // locals
  160. //
  161.  
  162. LOCAL CHAR  szIni[]          = "HYPEROID.INI";
  163. LOCAL CHAR  szLicense[]      = "LicenseRead";
  164. LOCAL CHAR  szDrawDelay[]    = "DrawDelay";
  165. LOCAL CHAR  szMax[]          = "Max";
  166. LOCAL CHAR  szX[]            = "X";
  167. LOCAL CHAR  szY[]            = "Y";
  168. LOCAL CHAR  szW[]            = "W";
  169. LOCAL CHAR  szH[]            = "H";
  170. LOCAL CHAR  szBW[]           = "Mono";
  171. LOCAL CHAR  szPalette[]      = "Palette";
  172. LOCAL CHAR  szKeys[]         = "Keys";
  173. LOCAL CHAR  szShield[]       = "Shield";
  174. LOCAL CHAR  szClockwise[]    = "Clockwise";
  175. LOCAL CHAR  szCtrClockwise[] = "CtrClockwise";
  176. LOCAL CHAR  szThrust[]       = "Thrust";
  177. LOCAL CHAR  szRevThrust[]    = "RevThrust";
  178. LOCAL CHAR  szFire[]         = "Fire";
  179. LOCAL CHAR  szBomb[]         = "Bomb";
  180. LOCAL CHAR  szHi[]           = "Hi";
  181.  
  182. LOCAL CHAR  *szColorName[] =
  183. {
  184.         "Black", "DkGrey", "Grey", "White",
  185.         "DkRed", "Red",  "DkGreen", "Green", "DkBlue", "Blue",
  186.         "DkYellow", "Yellow", "DkCyan", "Cyan", "DkMagenta", "Magenta"
  187. };
  188.  
  189. LOCAL DWORD         dwColors[] =
  190. {
  191.   RGB(0,0,0), RGB(128,128,128),
  192.   RGB(192,192,192), RGB(255,255,255),
  193.   RGB(128,0,0), RGB(255,0,0),
  194.   RGB(0,128,0), RGB(0,255,0),
  195.   RGB(0,0,128), RGB(0,0,255),
  196.   RGB(128,128,0), RGB(255,255,0),
  197.   RGB(0,128,128), RGB(0,255,255),
  198.   RGB(128,0,128), RGB(255,0,255),
  199. };
  200.  
  201.  
  202. // ***************************************************************************
  203. // PrintLetters - create letter objects from a string
  204. // ***************************************************************************
  205. VOID APIENTRY
  206. PrintLetters( LPSTR lpszText, POINT Pos, POINT Vel, BYTE byColor, INT nSize )
  207. {
  208.         INT             nLen = strlen( lpszText );
  209.         INT             nCnt = nLen;
  210.         INT             nSpace = nSize + nSize / 2;
  211.         INT             nBase = (nLen - 1) * nSpace;
  212.         INT             nBaseStart = Pos.x + nBase / 2;
  213.  
  214.         while (nCnt--)
  215.         {
  216.                 NPOBJ npLtr = CreateLetter( lpszText[nCnt],
  217.                                             nSize / 2, 20 + arand(70));
  218.                 if (npLtr)
  219.                 {
  220.                         npLtr->Pos.x = nBaseStart;
  221.                         npLtr->Pos.y = Pos.y;
  222.                         npLtr->Vel = Vel;
  223.                         npLtr->byColor = byColor;
  224.                 }
  225.                 nBaseStart -= nSpace;
  226.         }
  227. }
  228.  
  229.  
  230. // ***************************************************************************
  231. // SpinLetters - spin letter objects away from center for effect
  232. // ***************************************************************************
  233. VOID APIENTRY
  234. SpinLetters( LPSTR lpszText, POINT Pos, POINT Vel, BYTE byColor, INT nSize )
  235. {
  236.         INT             nLen = strlen( lpszText );
  237.         INT             nCnt = nLen;
  238.         INT             nSpace = nSize + nSize / 2;
  239.         INT             nBase = (nLen - 1) * nSpace;
  240.         INT             nBaseStart = Pos.x + nBase / 2;
  241.  
  242.         while (nCnt--)
  243.         {
  244.                 NPOBJ npLtr = CreateLetter( lpszText[nCnt],
  245.                                             nSize / 2, 30 + arand(45));
  246.                 if (npLtr)
  247.                 {
  248.                         INT nSpin = (nCnt - nLen / 2) * 2;
  249.                         npLtr->Pos.x = nBaseStart;
  250.                         npLtr->Pos.y = Pos.y;
  251.                         npLtr->Vel = Vel;
  252.                         npLtr->Vel.x += nSpin * 16;
  253.                         npLtr->nSpin = -nSpin;
  254.                         npLtr->byColor = byColor;
  255.                 }
  256.                 nBaseStart -= nSpace;
  257.         }
  258. }
  259.  
  260.  
  261. // ***************************************************************************
  262. // CreateHyperoidPalette - create a logical palette
  263. // ***************************************************************************
  264. HPALETTE APIENTRY
  265. CreateHyperoidPalette( VOID )
  266. {
  267.   HPALETTE        hPalette;
  268.   HDC             hIC = CreateIC( "DISPLAY", NULL, NULL, NULL );
  269.   INT             t;
  270.   PALETTEENTRY    Pal[PALETTE_SIZE + 2];
  271.   NPLOGPALETTE    npLogPalette = (NPLOGPALETTE) Pal;
  272.  
  273.   // are we forced into using b&w?
  274.   bBW = FALSE;
  275.   if( GetDeviceCaps( hIC, NUMCOLORS ) < 8 )
  276.     bBW = TRUE;
  277.   DeleteDC( hIC );
  278.   if( GetPrivateProfileInt( szAppName, szBW, FALSE, szIni ) )
  279.     bBW = TRUE;
  280.  
  281.   npLogPalette->palVersion    = 0x0300;
  282.   npLogPalette->palNumEntries = PALETTE_SIZE;
  283.  
  284.   for( t = 0; t < PALETTE_SIZE; ++t ) {
  285.     DWORD   dwColor = dwColors[t];
  286.     CHAR    szBuff[32];
  287.  
  288.     GetPrivateProfileString( szPalette, szColorName[t], "",
  289.       szBuff, sizeof(szBuff), szIni );
  290.  
  291.     if( szBuff[0] ) {
  292.       INT r, g, b;
  293.       LPSTR lpBuff = szBuff;
  294.  
  295.       r = g = b = 255;
  296.       while( *lpBuff == ' ' )
  297.         ++lpBuff;
  298.       r = atoi( lpBuff );
  299.       while( *lpBuff && *lpBuff != ',' )
  300.         ++lpBuff;
  301.       if( *lpBuff == ',' )
  302.         g = atoi( ++lpBuff );
  303.       while( *lpBuff && *lpBuff != ',' )
  304.         ++lpBuff;
  305.       if( *lpBuff == ',' )
  306.         b = atoi( ++lpBuff );
  307.       dwColor = RGB( r, g, b );
  308.     }
  309.  
  310.     if(bBW)
  311.       dwColor = ((dwColor == RGB(0,0,0)) ? RGB(0,0,0) : RGB(255,255,255));
  312.  
  313.     npLogPalette->palPalEntry[t].peRed   = GetRValue( dwColor );
  314.     npLogPalette->palPalEntry[t].peGreen = GetGValue( dwColor );
  315.     npLogPalette->palPalEntry[t].peBlue  = GetBValue( dwColor );
  316.     npLogPalette->palPalEntry[t].peFlags = 0;
  317.   }
  318.  
  319.   hPalette = CreatePalette( npLogPalette );
  320.   return( hPalette );
  321. }
  322.  
  323.  
  324. // ***************************************************************************
  325. // CreateHyperoidClass - create the class of Hyperoid's window
  326. // ***************************************************************************
  327. BOOL APIENTRY
  328. CreateHyperoidClass( VOID )
  329. {
  330.   WNDCLASS        Class;
  331.  
  332.   // load the name from the resource file
  333.   LoadString( hAppInst, IDS_NAME, szAppName, sizeof(szAppName) );
  334.  
  335.   Class.style         = CS_HREDRAW | CS_VREDRAW;
  336.   Class.lpfnWndProc   = (WNDPROC) HyperoidWndProc;
  337.   Class.cbClsExtra    = 0;
  338.   Class.cbWndExtra    = 0;
  339.   Class.hInstance     = hAppInst;
  340.   Class.hIcon         = (HICON)NULL;
  341.   Class.hCursor       = (HCURSOR)NULL;
  342.   Class.hbrBackground = HNULL;
  343.   Class.lpszMenuName  = szAppName;
  344.   Class.lpszClassName = szAppName;
  345.  
  346.   return( RegisterClass( &Class ) );
  347. }
  348.  
  349.  
  350. // ***************************************************************************
  351. // SetHyperoidMenu - add Hyperoid's menu items to the system menu
  352. // ***************************************************************************
  353. VOID APIENTRY
  354. SetHyperoidMenu( HWND hWnd, INT nFirstID, INT nLastID )
  355. {
  356.   CHAR   szMenuName[40];
  357.   HMENU  hMenu;
  358.  
  359.   hMenu = GetSystemMenu( hWnd, TRUE );
  360.   if( hMenu == HNULL )
  361.     hMenu = GetSystemMenu( hWnd, FALSE );
  362.   if( hMenu == HNULL )
  363.     return;
  364.  
  365.   while( nFirstID <= nLastID ) {
  366.     LoadString( hAppInst, nFirstID, szMenuName, sizeof(szMenuName) );
  367.     AppendMenu( hMenu, MF_SEPARATOR, 0, 0 );
  368.     AppendMenu( hMenu, MF_STRING, nFirstID, szMenuName );
  369.     nFirstID++;
  370.   }
  371. }
  372.  
  373.  
  374. // ***************************************************************************
  375. // CreateHyperoidWindow - open the Hyperoid window
  376. // ***************************************************************************
  377. HWND APIENTRY
  378. CreateHyperoidWindow( LPSTR lpszCmd, INT nCmdShow )
  379. {
  380.   HWND    hWnd;
  381.   INT     x, y, w, h;
  382.   CHAR    szBuff[32];
  383.  
  384.   UNREFERENCED_PARAMETER( lpszCmd );
  385.  
  386.   // get the highscore profile here for lack of a better place...
  387.   GetPrivateProfileString( szAppName, szHi, "0", szBuff, sizeof(szBuff), szIni );
  388.   lHighScore = atol( szBuff );
  389.  
  390.   x = GetPrivateProfileInt( szAppName, szX, CW_USEDEFAULT, szIni );
  391.   y = GetPrivateProfileInt( szAppName, szY, CW_USEDEFAULT, szIni );
  392.   w = GetPrivateProfileInt( szAppName, szW, CW_USEDEFAULT, szIni );
  393.   h = GetPrivateProfileInt( szAppName, szH, CW_USEDEFAULT, szIni );
  394.  
  395.   if( GetPrivateProfileInt( szAppName, szMax, FALSE, szIni )
  396.       && nCmdShow == SW_NORMAL )
  397.     nCmdShow = SW_SHOWMAXIMIZED;
  398.  
  399.   hWnd = CreateWindow(
  400.            szAppName, szAppName, WS_OVERLAPPEDWINDOW,
  401.            x, y, w, h, HNULL, HNULL, hAppInst, NULL );
  402.  
  403.   if( hWnd == HNULL )
  404.     return( HNULL );
  405.  
  406.   ShowWindow( hWnd, nCmdShow );
  407.   UpdateWindow( hWnd );
  408.   SetHyperoidMenu( hWnd, IDM_NEW, IDM_ABOUT );
  409.  
  410.   // show the license...
  411.   if( !GetPrivateProfileInt( szAppName, szLicense, FALSE, szIni ) ) {
  412.     MessageBeep( HYPEROID_HELPSTYLE );
  413.     MessageBox( hWnd, HYPEROID_LICENSE, "Hyperoid License", HYPEROID_HELPSTYLE );
  414.     // ...and never show it again (unless they want to see it)
  415.     WritePrivateProfileString( szAppName, szLicense, "1", szIni );
  416.   }
  417.  
  418.   return( hWnd );
  419. }
  420.  
  421.  
  422. // ***************************************************************************
  423. // SaveHyperoidWindowPos - write out the .ini information
  424. // ***************************************************************************
  425. VOID APIENTRY
  426. SaveHyperoidWindowPos( HWND hWnd )
  427. {
  428.         RECT            rect;
  429.         CHAR            szBuff[32];
  430.  
  431.         // save the highscore profile here for lack of a better place...
  432.         if (lHighScore)
  433.         {
  434.                 wsprintf( szBuff, "%lu", lHighScore );
  435.                 WritePrivateProfileString( szAppName, szHi, szBuff, szIni );
  436.         }
  437.  
  438.         if (IsIconic( hWnd )) return;
  439.         if (IsZoomed( hWnd ))
  440.         {
  441.                 WritePrivateProfileString( szAppName, szMax, "1", szIni );
  442.                 return;
  443.         }
  444.         else WritePrivateProfileString( szAppName, szMax, NULL, szIni );
  445.  
  446.         GetWindowRect( hWnd, &rect );
  447.         wsprintf( szBuff, "%d", rect.left );
  448.         WritePrivateProfileString( szAppName, szX, szBuff, szIni );
  449.         wsprintf( szBuff, "%d", rect.top );
  450.         WritePrivateProfileString( szAppName, szY, szBuff, szIni );
  451.         wsprintf( szBuff, "%d", rect.right - rect.left );
  452.         WritePrivateProfileString( szAppName, szW, szBuff, szIni );
  453.         wsprintf( szBuff, "%d", rect.bottom - rect.top );
  454.         WritePrivateProfileString( szAppName, szH, szBuff, szIni );
  455. }
  456.  
  457.  
  458. // ***************************************************************************
  459. // GetHyperoidIni - load the ini file information
  460. // ***************************************************************************
  461. VOID APIENTRY
  462. GetHyperoidIni( VOID )
  463. {
  464.   nDrawDelay = GetPrivateProfileInt( szAppName, szDrawDelay, DRAW_DELAY, szIni );
  465.   vkShld     = GetPrivateProfileInt( szKeys, szShield, VK_TAB, szIni );
  466.   vkClkw     = GetPrivateProfileInt( szKeys, szClockwise, VK_LEFT, szIni );
  467.   vkCtrClkw  = GetPrivateProfileInt( szKeys, szCtrClockwise, VK_RIGHT, szIni );
  468.   vkThrst    = GetPrivateProfileInt( szKeys, szThrust, VK_DOWN, szIni );
  469.   vkRvThrst  = GetPrivateProfileInt( szKeys, szRevThrust, VK_UP, szIni );
  470.   vkFire     = GetPrivateProfileInt( szKeys, szFire, VK_SPACE, szIni );
  471.   vkBomb     = GetPrivateProfileInt( szKeys, szBomb, 'S', szIni );
  472. }
  473.  
  474.  
  475. // ***************************************************************************
  476. // HyperoidHelp - show help
  477. // ***************************************************************************
  478. VOID APIENTRY
  479. HyperoidHelp( HWND hWnd )
  480. {
  481. //  MessageBox( hWnd, HYPEROID_HELP, "Hyperoid help", HYPEROID_HELPSTYLE );
  482. //  MessageBox( hWnd, HYPEROID_HELP2, "Hyperoid.ini help", HYPEROID_HELPSTYLE );
  483.   WinHelp( hWnd, "Hyperoid.Hlp", HELP_KEY, (DWORD) (LPSTR) "Hyperoid" );
  484. }
  485.  
  486.  
  487. // ***************************************************************************
  488. // HyperoidAboutDlg - the about box proc
  489. // ***************************************************************************
  490. BOOL APIENTRY
  491. HyperoidAboutDlg( HWND hDlg, UINT message, UINT wParam, LONG lParam )
  492. {
  493.   UNREFERENCED_PARAMETER( lParam );
  494.  
  495.   switch( message ) {
  496.  
  497.     case WM_INITDIALOG:
  498.       if( lHighScore ) {
  499.         CHAR szBuff[40];
  500.  
  501.         wsprintf( szBuff, "High Score: %7.7lu", lHighScore );
  502.         SetDlgItemText( hDlg, IDD_A_HISCORE, szBuff );
  503.       }
  504.       break;
  505.  
  506.     case WM_COMMAND:
  507.       switch( wParam ) {
  508.  
  509.         case IDD_A_HELP:
  510.           HyperoidHelp( hDlg );
  511.           EndDialog( hDlg, 0 );
  512.           break;
  513.  
  514.         case IDOK:
  515.           EndDialog( hDlg, 0 );
  516.           break;
  517.  
  518.         default:
  519.           return( FALSE );
  520.       }
  521.       break;
  522.  
  523.     case WM_CLOSE:
  524.       EndDialog( hDlg, FALSE );
  525.       break;
  526.  
  527.     default:
  528.       return( FALSE );
  529.   }
  530.  
  531.   return( TRUE );
  532. }
  533.  
  534.  
  535. // ***************************************************************************
  536. // AboutHyperoid - show the about box
  537. // ***************************************************************************
  538. VOID APIENTRY
  539. AboutHyperoid( HWND hWnd )
  540. {
  541.   FARPROC lpprocAbout = (FARPROC) MakeProcInstance( HyperoidAboutDlg, hAppInst );
  542.   DialogBox( hAppInst, INTRES( IDD_ABOUT ), hWnd, (DLGPROC) lpprocAbout );
  543.   FreeProcInstance( lpprocAbout );
  544. }
  545.